package Persistencia;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import Negocio.Consumo;
import Negocio.Factura;
import Negocio.ItemFactura;
import Negocio.Linea;
import Negocio.LineaAdicional;
import Negocio.LineaTitular;
import Negocio.Plan;
import Negocio.Servicio;
import Negocio.Usuario;

public class AdministradorPersistenciaLinea {
private static AdministradorPersistenciaLinea pool;
	
	
	private AdministradorPersistenciaLinea()
	{
		
	}
	public static AdministradorPersistenciaLinea getInstancia()
	{
		if (pool== null)
			pool =new AdministradorPersistenciaLinea();
		return pool;
	}
	
	public void insertLineaTitular(LineaTitular lt)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Lineas (numero, fecha_contrato, nro_Plan, dni, linea_titular, nombre_adiciona, tipo) VALUES (?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,lt.getNumero());
			ps.setDate(2,(java.sql.Date) lt.getFechaContrato());
			ps.setInt(3,lt.getPlan().getNumero());
			ps.setString(4,lt.getUsuario().getDni());
			ps.setString(5,"");
			ps.setString(6,"");
			ps.setString(7,"titular");
			
			ps.execute();
			
			AdministradorPersistenciaUsuario.getInstancia().update(lt.getUsuario()); // Se realiza el UPDATE del registro de usuario con la Linea asociada al mismo
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar LineaTitular: " + e.getMessage());
				System.out.println("Stack Trace al Insertar LineaTitular: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	
	public void insertLineaAdicional(LineaAdicional la)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Lineas (numero, fecha_contrato, nro_Plan, dni, linea_titular, nombre_adiciona, tipo) VALUES (?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,la.getNumero());
			ps.setDate(2,(java.sql.Date) la.getFechaContrato());
			ps.setInt(3,la.getPlan().getNumero());
			ps.setString(4,la.getUsuario().getDni());
			ps.setString(5,la.getNroTitular());
			ps.setString(6,la.getNombre());
			ps.setString(7,"adicional");
			
			ps.execute();
			
			AdministradorPersistenciaUsuario.getInstancia().update(la.getUsuario()); // Se realiza el UPDATE del registro de usuario con la Linea asociada al mismo
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar LineaAdicional: " + e.getMessage());
				System.out.println("Stack Trace al Insertar LineaAdicional: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	
	public void insertConsumo(String numeroLinea, Consumo consumo, int nro){
		
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			
			//Insertar Consumo
			PreparedStatement ps = con.prepareStatement("INSERT INTO Consumos (nro_Consumo, fecha, cantidad_consumo, nro_Destino, nombre_servicio, precio_servicio, liquidado, numero_linea) VALUES (?,?,?,?,?,?,?,?)");
			ps.setInt(1, nro);
			ps.setDate(2, (java.sql.Date) consumo.getFechaConsumo());
			ps.setInt(3, consumo.getCantidadConsumida());	
			ps.setString(4, consumo.getNroDestino());
			ps.setString(5, consumo.getNombreServicio());
			ps.setDouble(6, consumo.getPrecioServicio());
			ps.setBoolean(7, consumo.isLiquidado());	
			ps.setString(8, numeroLinea);
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void updateTitular(LineaTitular lt)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia Update en tabla destino
			String senten = "UPDATE Lineas set fecha_contrato = ? ,nro_Plan = ? ,dni = ? where numero = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setDate(1, (java.sql.Date) lt.getFechaContrato());
			ps.setInt(2,lt.getPlan().getNumero());
			ps.setString(3,lt.getUsuario().getDni());
			ps.setString(4,lt.getNumero());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Modificar Linea Titular: " + e.getMessage());
				System.out.println("Stack Trace al Modificar Linea Titular: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	      
		
	}
	
	public void updateAdicional(LineaAdicional la)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia Update en tabla destino
			String senten = "UPDATE Lineas set fecha_contrato = ? ,nro_Plan = ? ,dni = ?, linea_titular = ?, nombre_adiciona = ? where numero = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setDate(1, (java.sql.Date) la.getFechaContrato());
			ps.setInt(2,la.getPlan().getNumero());
			ps.setString(3,la.getUsuario().getDni());
			ps.setString(4,la.getNroTitular());
			ps.setString(5,la.getNombre());
			ps.setString(6,la.getNumero());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Modificar Linea Adicional: " + e.getMessage());
				System.out.println("Stack Trace al Modificar Linea Adicional: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	     
	      		
	}
	
	public void deleteTitular (LineaTitular lt)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "DELETE from Lineas where numero = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,lt.getNumero());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Linea Titular: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Linea Titular: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	      

	}
	
	public void deleteAdicional (LineaAdicional la)
	{
		
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "DELETE from Lineas where numero = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,la.getNumero());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Linea Adicional: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Linea Adicional: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	      

	}

	
	public LineaTitular buscarLineaTitular(String numero)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try{
			PreparedStatement ps = con.prepareStatement("SELECT * from Lineas where numero = ?");
			ps.setString(1, numero);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				Date fechaContrato = rs.getDate("fecha_contrato");
				int nroPlan = rs.getInt("nro_Plan");
				String tipoPlan = AdministradorPersistenciaPlan.getInstancia().getTipo(nroPlan);
				Plan planActual;
				if(tipoPlan.equals("Base"))
					planActual = AdministradorPersistenciaPlan.getInstancia().buscarPlanBase(nroPlan);
				else
					if (tipoPlan.equals("Prepago"))
					    planActual = AdministradorPersistenciaPlan.getInstancia().buscarPlanPrepago(nroPlan);
					else
						planActual = AdministradorPersistenciaPlan.getInstancia().buscarPlanAdicional(nroPlan);
				String dniUsuario = rs.getString("dni");
				Usuario usuarioActual = AdministradorPersistenciaUsuario.getInstancia().buscarUsuario(dniUsuario);
				Vector<Consumo> consumos = new Vector<Consumo>();
				PreparedStatement ps2 = con.prepareStatement("SELECT * from Consumos where numero_linea = ?");
				ps2.setString(1, numero);
				ResultSet itConsumos = ps2.executeQuery();
				while(itConsumos.next()){
					Date fecha = itConsumos.getDate("fecha");
					int cantConsumo = itConsumos.getInt("cantidad_consumo");
					String nroDestino = itConsumos.getString("nro_Destino");
					String nombreServicio = rs.getString("nombre_servicio");
					Servicio servicio = AdministradorPersistenciaServicio.getInstancia().buscarServicio(nombreServicio);
					double precioServicio = itConsumos.getFloat("precio_servicio");
					boolean liquidado = itConsumos.getBoolean("liquidado");
					Consumo consumo = new Consumo(fecha, cantConsumo, nroDestino, servicio, precioServicio, liquidado);
					consumos.add(consumo);
				}
				LineaTitular lineaTitular = new LineaTitular(planActual, numero, usuarioActual, fechaContrato, consumos);
				itConsumos.close();
				ps2.close();
				rs.close();
				ps.close();
				return lineaTitular;
			}
			rs.close();
			ps.close();
		}
		catch(Exception e){
			System.out.println("Error en Buscar Linea Titular");
			e.printStackTrace();
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return null;
	}
	
	
	public LineaAdicional buscarLineaAdicional(String numero)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try{
			PreparedStatement ps = con.prepareStatement("SELECT * from Lineas where numero = ?");
			ps.setString(1, numero);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				Date fechaContrato = rs.getDate("fecha_contrato");
				int nroPlan = rs.getInt("nro_Plan");
				String tipoPlan = AdministradorPersistenciaPlan.getInstancia().getTipo(nroPlan);
				Plan planActual;
				if(tipoPlan.equals("Base"))
					planActual = AdministradorPersistenciaPlan.getInstancia().buscarPlanBase(nroPlan);
				else
					if (tipoPlan.equals("Prepago"))
					    planActual = AdministradorPersistenciaPlan.getInstancia().buscarPlanPrepago(nroPlan);
					else
						planActual = AdministradorPersistenciaPlan.getInstancia().buscarPlanAdicional(nroPlan);
				String dniUsuario = rs.getString("dni");
				Usuario usuarioActual = AdministradorPersistenciaUsuario.getInstancia().buscarUsuario(dniUsuario);
				String nroTitular = rs.getString("linea_titular");
				Vector<Consumo> consumos = new Vector<Consumo>();
				PreparedStatement ps2 = con.prepareStatement("SELECT * from Consumos where numero_linea = ?");
				ps2.setString(1, numero);
				ResultSet itConsumos = ps2.executeQuery();
				while(itConsumos.next()){
					Date fecha = itConsumos.getDate("fecha");
					int cantConsumo = itConsumos.getInt("cantidad_consumo");
					String nroDestino = itConsumos.getString("nro_Destino");
					String nombreServicio = rs.getString("nombre_servicio");
					Servicio servicio = AdministradorPersistenciaServicio.getInstancia().buscarServicio(nombreServicio);
					double precioServicio = itConsumos.getFloat("precio_servicio");
					boolean liquidado = itConsumos.getBoolean("liquidado");
					Consumo consumo = new Consumo(fecha, cantConsumo, nroDestino, servicio, precioServicio, liquidado);
					consumos.add(consumo);
				}
				LineaAdicional lineaAdicional = new LineaAdicional(planActual, nroTitular, numero, usuarioActual, fechaContrato, consumos);
				itConsumos.close();
				ps2.close();
				rs.close();
				ps.close();
				return lineaAdicional;
			}
			rs.close();
			ps.close();
		}
		catch(Exception e){
			System.out.println("Error en Buscar Linea Adicional");
			e.printStackTrace();
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return null;
	}


}
